#pragma once

#include "ProMode.h"
#include <string>

#include <boost\mpl\vector.hpp>
#include <boost\mpl\erase.hpp>
#include <boost\mpl\find.hpp>
#include <boost\mpl\find_if.hpp>
#include <boost\mpl\size.hpp>
#include "OptionTag.h"
#include "ProMdl.h"
#include "ProUI.h"


using namespace boost;



namespace pyBind{



template<typename T>
struct ArgFormatString_T
{
	const char *operator()() {
		T a;
		char * s = a;
	}
};

		 
template<>
struct ArgFormatString_T<int>
{
	const char *operator()() {return "i";}
};	

template<>
struct ArgFormatString_T<double>
{
	const char *operator()() {return "d";}
};	
 
template<>
struct ArgFormatString_T<ProMode>
{
	const char *operator()() {return "i";}
};	
template<>
struct ArgFormatString_T<ProMdlType>
{
	const char *operator()() {return "i";}
};
template<>
struct ArgFormatString_T<wchar_t*>
{
	const char *operator()() {return "U";}
};
template<>
struct ArgFormatString_T<wchar_t [32]>
{
	const char *operator()() {return "U";}
};
/*
template<>
struct ArgFormatString_T<ProUIMessageType>
{
	const char *operator()() {return "i";}
};

template<>
struct ArgFormatString_T<ProUIMessageButton>
{
	const char *operator()() {return "i";}
};*/



//

template<typename T ,bool isenum = false>
struct ArgFormatString_Enum :ArgFormatString_T<T>
{
};

template<typename T >
struct ArgFormatString_Enum<T,true>
{
	const char *operator()() {return "i";}
}; 

template<typename T>
struct ArgFormatString_s:ArgFormatString_Enum<T,is_enum<T>::value>
{
};
	
 /*
template<typename S, typename Iter >
struct ArgFormatString_T
{
	static const bool flg = is_same< mpl::end<S>::type, Iter>::value ? true : false;
	void operator() (std::string& val)
	{
		val += ArgFormatString_s<mpl::deref<Iter>::type>()();
		ArgFormatString_T<S, mpl::next<Iter>::type>()(val);
	}
};

template<typename S>
struct ArgFormatString_T<S,typename mpl::end<S>::type>
{
	void operator() (std::string&) { }
};*/







};//end of namespace  pyBind